package com.dxyxx.framework;

import org.apache.http.Header;
import org.codehaus.jackson.type.JavaType;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ScrollView;
import android.widget.Toast;
import br.com.pierry.simpletoast.SimpleToast;

import com.dxyxx.R;
import com.dxyxx.android.setting.UserPreferences;
import com.dxyxx.jni.AESUtil;
import com.dxyxx.jni.SecurityUtil;
import com.dxyxx.pojo.ResponseResult;
import com.dxyxx.pojo.User;
import com.http.HttpUtil;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
import com.ta.utdid2.android.utils.StringUtils;

/**
 * 
 * ①登陆界面。存储 用户名+密码 到 数据库， 然后 记录30天 登陆失效。
 * 
 * ②整合“重新登录”功能
 * 
 * ③如果这个界面 跳转到 “验证码”登陆界面， 就是使用startActivityForResult 功能，如果onResult接收到 登陆成功，
 * 就finish 掉自己
 * 
 * @author Administrator
 * 
 */
public class LoginActivity extends BaseActivity {
	private UserPreferences userPreferences;
	private EditText phone;
	private EditText password;
	private ScrollView loginPanel;
	private String encryptPassword;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		/**
		 * 先在 Manifest.xml中设置 透明，如果relogin=true, 就自动登录。
		 * 
		 * 登录失败了，就销毁，不返回任何token。然后使用relogin=false重新生成LoginActivity 展示页面。
		 * 
		 * 登陆成功了，就销毁，不生成新的Activity，然后返回 token=xxxx
		 */
		// 判断是否属于重新登录。 允许自动重新登录的 要求是 keepTime 没有超过 15天，后面完善
		Bundle bundle = this.getIntent().getExtras();
		boolean relogin = bundle.getBoolean("relogin");
		if (!relogin) {//非反复登陆，设置背景
			// setTheme必须在onCreteate(savedInstanceState) 之前调用
			setTheme(R.style.dxyxx_whiteTheme);
		}
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_login);
		phone = (EditText) findViewById(R.id.username);
		phone.setSelectAllOnFocus(true);
		userPreferences = UserPreferences.getInstance(getApplicationContext());
		loginPanel = (ScrollView) findViewById(R.id.loginPanel);
		phone.setFocusable(true);
		phone.setFocusableInTouchMode(true);
		password = (EditText) findViewById(R.id.passwd);
		findViewById(R.id.registerButton).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// 换到 另一种登录方式，是需要关注result的。 顺便传递一个 id过去
				//startActivityForResult(new Intent(LoginActivity.this, MobLoginActivity.class), 1);
				startActivity(new Intent(LoginActivity.this, MobRegisterActivity.class));
			}
		});
		password.setSelectAllOnFocus(true);

		password.setFocusable(true);
		password.setFocusableInTouchMode(true);

		findViewById(R.id.b_login).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				String urlString = "login";
				RequestParams params = new RequestParams();
				String phoneStr = phone.getText().toString().trim();
				String passwordStr = password.getText().toString().trim();

				params.add("phone", phoneStr);
				//密码加密 SecurityUtil.getKeyValue(MainActivity.this)
				String key = new String(SecurityUtil.getKeyValue(LoginActivity.this));
				try {
					encryptPassword = AESUtil.Encrypt(passwordStr, key);
					params.add("password", encryptPassword);
				} catch (Exception e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
				if (StringUtils.isEmpty(phoneStr) || StringUtils.isEmpty(passwordStr)) {
					SimpleToast.error(LoginActivity.this, "手机号或者密码不能为空");
					return;
				}
				final ProgressDialog progressDialog = ProgressDialog.show(LoginActivity.this, null, null);
				progressDialog.setContentView(R.layout.dialog_circle);
				HttpUtil.post(urlString, params, new AsyncHttpResponseHandler() {

					@Override
					public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
						Toast.makeText(LoginActivity.this, "网络问题", 1).show();
						progressDialog.dismiss();
					}

					@Override
					public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
						try {
							JavaType javaType = getObjectMapper().getTypeFactory().constructParametricType(ResponseResult.class, User.class);
							ResponseResult<User> rr = getObjectMapper().readValue(arg2, javaType);
							// 存储 数据到 文件。
							if (rr.getCode() == 1) {
								User returnUser = rr.getObject();
								final User user = new User(phone.getText().toString(), encryptPassword.trim(), rr.getObject().getImage(), returnUser.getSex(), returnUser.getBirthday(), System.currentTimeMillis(), true, returnUser.getUsername());
								userPreferences.setUser(user);//只有此处是setUser
								userPreferences.setToken(rr.getInfo());
								Intent intent = new Intent();
								// 关闭Activity
								intent.putExtra("result", rr.getObject());
								// 设置返回数据
								SimpleToast.ok(LoginActivity.this, "登陆成功");
								LoginActivity.this.setResult(ResultCode.Login, intent);
								LoginActivity.this.finish();
							} else {
								SimpleToast.info(LoginActivity.this, "用户名密码错误");
							}
						} catch (Exception e) {
							e.printStackTrace();
						} finally {
							progressDialog.dismiss();
						}
					}

				});

			}
		});

		boolean expired = false;
		if (relogin && !expired) {
			// 设置 不可见。

			String urlString = "login";
			RequestParams params = new RequestParams();
			User user = userPreferences.getCurrentUser();
			if (user.getPhone() != null) {//user 不会是null
				params.add("phone", user.getPhone());
				params.add("password", user.getPassword());
			}
			loginPanel.setVisibility(View.INVISIBLE);

			HttpUtil.post(urlString, params, new AsyncHttpResponseHandler() {

				@Override
				public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
					Toast.makeText(LoginActivity.this, "网络问题", 1).show();
				}

				@Override
				public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {

					// 更新数据 数据到 文件。
					try {
						JavaType javaType = getObjectMapper().getTypeFactory().constructParametricType(ResponseResult.class, User.class);
						ResponseResult<User> rr = getObjectMapper().readValue(arg2, javaType);
						// 存储 数据到 文件。
						if (rr.getCode() == 1) {
							userPreferences.updateToken(rr.getInfo());

							Intent intent = new Intent();
							// 把返回数据存入Intent
							intent.putExtra("result", rr.getObject());
							// 设置返回数据
							LoginActivity.this.setResult(ResultCode.Login, intent);
							// 关闭Activity
							LoginActivity.this.finish();

						} else {
							// loginPanel.setBackgroundColor(0xffFFFFFF);
							// loginPanel.setVisibility(View.VISIBLE);
							// getWindow().setBackgroundDrawableResource(R.drawable.app_start);
							// 自动登录失败,销毁 透明页面。设置relogin=false生成新的LoginACtivity，  显示登陆界面
							Intent intent = new Intent(LoginActivity.this, LoginActivity.class);
							intent.putExtra("relogin", false);
							startActivityForResult(intent, 1);
							//finish();
						}
					} catch (Exception e) {
						e.printStackTrace();
					}

				}

			});

		}
		// order = (Order) bundle.getSerializable("order");
		// loginPanel.setBackgroundColor(0x00000000);
		// loginPanel.setVisibility(View.INVISIBLE);
		// getWindow().setBackgroundDrawableResource(R.color.transparent);

		// 初始化 view
		initViews();
	}

	private void initViews() {

		findViewById(R.id.forgetpassword).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// 这种界面 不用管了result了。
				startActivity(new Intent(LoginActivity.this, MobGetbackPasswordActivity.class));
			}
		});

	}

	/**
	 * 透明的login activity 会打开不透明的login activity
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (data != null) {
			boolean result = data.getExtras().getBoolean("result");
			if (ResultCode.Login == resultCode) { // 登陆成功了

				Intent intent = new Intent();
				// 把返回数据存入Intent
				intent.putExtra("result", result);
				// 设置返回数据
				LoginActivity.this.setResult(ResultCode.Login, intent);

				LoginActivity.this.finish(); // 结束掉 透明的自己
			}
		} else {
			LoginActivity.this.finish(); // 不透明的结束了，透明的也要结束
		}
	}
}
